cmake_minimum_required(VERSION 3.10)

# 设置自定义临时目录以避免权限和特殊字符问题
if(WIN32)
    # 关键：设置MSBuild使用的临时目录为项目目录下的temp文件夹
    set(ENV{TEMP} "${CMAKE_BINARY_DIR}/temp")
    set(ENV{TMP} "${CMAKE_BINARY_DIR}/temp")
    set(ENV{MSBUILDTEMP} "${CMAKE_BINARY_DIR}/temp")
    
    # 确保temp目录存在
    file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/temp")
    
    # 为CMake设置临时目录
    set(CMAKE_TEMPORARY_DIRECTORY "${CMAKE_BINARY_DIR}/temp")
    
    # 避免使用用户名中的特殊字符路径
    set(CMAKE_MSVCIDE_RUN_PATH "${CMAKE_BINARY_DIR}/temp")
endif()

project(CppSearchEngine)

# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 包含目录
include_directories(src/include)

# 设置源文件
set(SOURCES
    src/backend/main.cpp
    src/backend/db_manager.cpp
    src/backend/http_server.cpp
    src/backend/user_manager.cpp
    src/backend/search_engine.cpp
    src/backend/ai_integration.cpp
    src/backend/config.cpp
)

# 添加可执行文件
add_executable(cpp_search_engine ${SOURCES})

# 基本Windows库
if(WIN32)
    target_link_libraries(cpp_search_engine ws2_32 winhttp)
endif()

# 简化版本 - 不依赖外部库
target_compile_definitions(cpp_search_engine PRIVATE 
    -DHAVE_CURL=0
    -DHAVE_OPENSSL=0
)

# 修复 MSVC 编译器警告问题
if(MSVC)
    # 禁用特定的编译器警告
    target_compile_options(cpp_search_engine PRIVATE 
        /wd4996  # 禁用不安全函数警告
        /wd4005  # 禁用宏重定义警告
        /wd4251  # 禁用 DLL 导出警告
        /wd4068  # 禁用未知 pragma 警告
        /wd4061  # 禁用枚举值未在 case 中处理警告
        /Zc:__cplusplus  # 启用正确的 __cplusplus 宏
    )
    
    # 设置编译器警告级别
    target_compile_options(cpp_search_engine PRIVATE /W3)
    
    # 添加特定的定义来避免 pragma pack 问题
    target_compile_definitions(cpp_search_engine PRIVATE 
        _CRT_SECURE_NO_WARNINGS
        _SCL_SECURE_NO_WARNINGS
        _WINSOCK_DEPRECATED_NO_WARNINGS
        _CRT_SECURE_NO_DEPRECATE
        _SCL_SECURE_NO_DEPRECATE
    )
    
    # 添加特定的 pragma 指令来处理标准库的 pack 问题
    target_compile_options(cpp_search_engine PRIVATE 
        /wd4100  # 未引用的形参
        /wd4505  # 未引用的函数
        /wd4514  # 未引用的内联函数
        /wd4710  # 函数未内联
        /wd4711  # 函数被选为内联
    )
endif()

# 复制前端文件到构建目录
file(COPY src/frontend DESTINATION ${CMAKE_BINARY_DIR})

# 输出信息
message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}")
message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")
message(STATUS "Output Directory: ${CMAKE_BINARY_DIR}")
message(STATUS "Building without external dependencies for compatibility")